home *** CD-ROM | disk | FTP | other *** search
/ ThrustMaster (Europe) (Press Kit) / ThrustMaster (Europe) (Press Kit).bin / progs / f16 / UTILS.SHR / TN-0001.TXT < prev   
Encoding:
Text File  |  1995-07-14  |  25.5 KB  |  569 lines

  1.                Thrustmaster Application Note AN-0001
  2.          Advanced Key Programming Techniques for the FLCS
  3.                Copyright (c) 1995 Thrustmaster, Inc.
  4.                          All Rights Reserved
  5.  
  6. Introduction
  7. ------------
  8.  
  9. The FLCS provides a comprehensive set of key functions which directly
  10. handle the majority of the keying requirements for most games by simply
  11. listing the keystrokes required. Situations do arise, however, that 
  12. require some non-standard handling. This note describes the built-in
  13. functions in some detail, and also outlines the various techniques
  14. that can be used when the built-in functions are not sufficient to 
  15. handle the requirement at hand.
  16.  
  17. Keyboard Basics
  18. ---------------
  19.  
  20. Programming the FLCS to perform a particular function is basically a 
  21. matter of getting it to send the right sequence of keycodes to the PC. 
  22. While the FLCS takes care of this for most of the standard keys and
  23. functions, advanced techniques require a basic understanding of how 
  24. the keyboard itself interacts with the PC.
  25.  
  26. The keyboard operates by sending 'Make' and 'Break' codes to the PC. 
  27. These 'codes' are sequences of one or more data bytes. They are not
  28. 'ASCII Characters', but just indicate which keys have been moved. 
  29. When you press a key, the 'Make' code is sent. When you release the 
  30. key, the 'Break' code is sent. Each key on the keyboard has a unique 
  31. sequence of codes assigned to it for its 'Make' and 'Break' sequences.
  32.  
  33. The PC can't actually determine whether a key is pressed or released 
  34. at any particular time. Rather, it simply keeps track of the 'Make' 
  35. and 'Break' codes. When it receives a 'Make' code, it flags the key 
  36. as pressed until it receives the corresponding 'Break' code, at which 
  37. time it flags the key as released. 
  38.  
  39. Since the sequencing of the 'Make' and 'Break' codes is important to 
  40. the following discussion, it will be convenient to adopt some notation 
  41. for them. In what follows, the '+' character will be used to indicate 
  42. the 'Make' code for a key, and the '-' character will be used to 
  43. indicate the 'Break' code. For instance:
  44.                                +a -a
  45.  
  46. would indicate the press and subsequent release of the 'a' key.
  47.  
  48. Combinational Keypresses
  49. ------------------------
  50.  
  51. Generating single keypresses or strings of single keypresses with the 
  52. FLCS is a straightforward process. The desired characters are simply 
  53. listed in the BTN statement. There are several situations, though, that 
  54. require that multiple keys be pressed simultaneously, and these can 
  55. create problems. The correct programming method is often not clear as 
  56. it depends on how the game processes the keystrokes. The remainder of 
  57. this note will attempt to explain the different techniques available 
  58. and when these techniques should be used.
  59.  
  60. SHF, ALT, and CTL
  61. -----------------
  62.  
  63. The most common form of simultaneous keypress is when it is necessary 
  64. to generate a modified key like CTRL-C, ALT-J, or even 'A', since the 
  65. upper cased character implies that the SHF key is held down while the 
  66. key is pressed. It is generally a simple matter to program these 
  67. combinations  with the FLCS, you simply precede the character with the 
  68. appropriate modifier:
  69.  
  70.                         BTN S1 CTL c
  71.  
  72. Any time you specify and upper case character, the FLCS generates the
  73. SHF code for you, so;
  74.  
  75.                         BTN S1 A
  76.  
  77. is actually treated as:
  78.  
  79.                         BTN S1 SHF a
  80.  
  81. and the key sequence generated is:
  82.  
  83.                        +SHF +a -SHF -a
  84.  
  85. It is worth noting that only the SHF, CTL, and ALT keywords are 
  86. treated as modifiers. The variations that specify particular keys, 
  87. such as LALT and RSHF are treated as regular keys. So if you program 
  88. something like:
  89.                         BTN S1 LALT j
  90.  
  91. the sequence that is generated is:
  92.  
  93.                      +LALT -LALT +j -j
  94.  
  95. and an actual ALT-J combination does not occur. Programming it as:
  96.  
  97.                        BTN S1 ALT j
  98.  
  99. produces the desired:
  100.  
  101.                        +ALT +j -ALT -j
  102.  
  103. Simultaneous Groups
  104. -------------------
  105.  
  106. As noted in the FLCS manual, if you enclose a set of characters in 
  107. 'curly brackets' it causes the ordering of 'Make' and 'Break' codes to 
  108. be modified so that the keys in the group are pressed simultaneously:
  109.                           
  110.                           BTN S1 {a b c}
  111.  
  112. will send the sequence:
  113.                          +a +b +c -a -b -c
  114.  
  115.  
  116. This function is useful when two or more keys need to be pressed at 
  117. the same time, but it does not hold the keys down for any appreciable 
  118. length of time. They are pressed and then immediately released. The 
  119. simultaneous group is also useful where a game requires a particular 
  120. SHF or ALT key to be used. The normal SHF, ALT, and CTL modifiers 
  121. always use the codes for the Left key, i.e. LSFT. If you needed 'Right 
  122. Shift x' you could program it as:
  123.  
  124.                           BTN S1 {RSFT x}
  125.  
  126. and force the use of the Right Shift key. The generated sequence would
  127. be:
  128.                          +RSFT +x -RSFT -x
  129.  
  130.  
  131. Repeating Keypresses
  132. --------------------
  133.  
  134. It frequently becomes necessary in FLCS programming to generate keys 
  135. that are 'held down' to achieve some particular function. Normally this 
  136. can be done by just specifying a single character as a repeating key:
  137.  
  138.                              BTN S1 a
  139.  
  140. This generates a sequence of multiple 'Make' codes while the button 
  141. is held down, and generates a single 'Break' code when the button is 
  142. released. 
  143.  
  144. This is essentially what the keyboard does, but there is one fundamental 
  145. difference. When another button is pressed and the FLCS sends another
  146. character, the FLCS will send a 'Break' code for the repeating character,
  147. even if the button (S1 in this example) is still held down. The keyboard
  148. does not send the 'Break' code until the key is released. For example, 
  149. if you programmed:
  150.                              BTN S1 a
  151.                              BTN S2 b
  152.  
  153. then pressed S1, pressed S2, released S2, and then released S1, the FLCS
  154. would generate something like:
  155.  
  156.                       +a +a +a +a -a +b +b +b +b -b
  157.                     
  158. whereas if you did the same thing on the keyboard using the actual 'a' 
  159. and 'b' keys, the sequence would look like this:
  160.  
  161.                       +a +a +a +a +b +b +b +b -b -a
  162.  
  163. The FLCS was coded this way on purpose. When you're using the keyboard, 
  164. you are generally aware of which keys you've got pressed at any particular 
  165. time, and inappropriate combinations don't occur very often. When you're 
  166. using the FLCS, it's not always apparent what keys you are pressing. For 
  167. example, look at the program segment:
  168.  
  169.                              BTN S1 A
  170.                              BTN S2 b
  171.  
  172. If the FLCS actually emulated the keyboard, the generated sequence would
  173. be:
  174.  
  175.                 +SHF +a +a +a +a +b +b +b +b -b -SHF -a
  176.  
  177. If you pressed them in the order outlined for the first example. If you 
  178. looked at this on the screen, you would see 'AAAABBBB', rather than the
  179. 'AAAAbbbb' that you would expect, since the SHF key has not been released.
  180. Forcing the 'Break' when S2 is pressed changes the sequence to:
  181.  
  182.                 +SHF +a +a +a +a -SHF -a +b +b +b +b -b
  183.  
  184. which is more in keeping with the intent of the program. This is a fairly
  185. simple example, worse problems could occur. If S1 were defined as 'ALT a',
  186. then so long as S1 were held, the PC would see every key coming at it as
  187. having the ALT modifier added, i.e. you'd not only get 'ALT a' like you 
  188. wanted, you'd get 'ALT b', too, since the ALT would still be down from 
  189. the S1 press. Disastrous combinations could occur, consider what might 
  190. happen if a program contained something like:
  191.  
  192.                             BTN S1 CTL a
  193.                             BTN S2 ALT j
  194.                             BTN S3 DEL
  195.  
  196. and all three buttons were pushed. The PC would see a simultaneous press 
  197. of CTL-ALT-DEL, and would likely reboot. Probably not exactly what you 
  198. wanted to happen.
  199.  
  200. Hold Codes
  201. ----------
  202.  
  203. In some circumstances, it is necessary to hold the key down even when 
  204. other buttons are pressed. The most common examples are keys that move 
  205. control surfaces, and situations that require multiple keys to be held 
  206. to achieve a particular view. For instance, suppose you wanted to program 
  207. a hat to control the rudders. You might try (assuming 'l' and 'r' are 
  208. the left and right rudder keys respectively)
  209.  
  210.                             BTN H1L l
  211.                             BTN H1R r
  212.  
  213. This would activate the rudders, but because of the way the repeating 
  214. keys operate on the FLCS, as soon as you pushed another button the rudder 
  215. would return to it's neutral position. The use of the /H code would get 
  216. around the problem, since it does not generate a 'Break' until the Hat 
  217. is released. The coding would look like this:
  218.  
  219.                            BTN H1L /H l
  220.                            BTN H1R /H r
  221.  
  222. The /H codes are also slightly different in the way they appear on the 
  223. screen. There is only a single 'Make' code generated, so you only see 
  224. one character when you press the button. The PC will see the key as held, 
  225. however, and in situations where the /H is required, the absence of the 
  226. repeated 'Make' codes is of no consequence. The game will be looking 
  227. only at the first 'Make' code in such situations, anyway.
  228.  
  229. Holding down multiple keys is simply a matter of adding them to the 
  230. list. To hold down KP8 and KP5 for a combinational view, the program 
  231. would look like this:
  232.                          BTN H1U KP8 KP5
  233.  
  234. When the button was pressed, the sequence generated would be:
  235.  
  236.                             +KP8 +KP5
  237.  
  238. and when the button was released, the sequence would be:
  239.  
  240.                             -KP8 -KP5
  241.  
  242. Any characters generated by other buttons while H1U was held would be 
  243. sent normally,
  244.  
  245. While /H codes are very useful, they are not without a few problems. 
  246. First, as mentioned earlier in the discussion of repeating keys, it's 
  247. generally not possible to use them for anything other than unmodified 
  248. keys. The use of upper-case, SHF, ALT or CTL modifiers creates problems 
  249. in that the PC will apply those modifiers to all characters transmitted 
  250. while the /H is held down, i.e.
  251.  
  252.                           BTN S1 /H A
  253.  
  254. will upper-case all keys transmitted while S1 is pressed. Consequently,
  255. the use of such modifiers must generally be avoided in /H groups.
  256.  
  257. A second limitation places on /H groups is that they cannot be used 
  258. with the /I and /O, or the /U, /M, and /D modifiers. The reason for 
  259. this is not immediately obvious, but to have allowed them to be used 
  260. there would create a strong likelihood of 'stuck' keys during operation. 
  261. Consider the following example:
  262.  
  263.                          BTN S1 /O /H a
  264.                                 /I /H b
  265.  
  266. Now suppose that during game play, you were to press S1, then press S3,
  267. then release S1. Since S3 was not pressed initially, the /O side of the
  268. definition would be in control. The initial press of S1 would send the
  269. 'Make' code for the 'a' as expected. When S3 was pressed, that would 
  270. put the /I side of the definition in control. Subsequently releasing 
  271. S1 would result in the 'Break' break code for the 'b' being sent. The 
  272. sequence at the PC would be:
  273.                               +a -b
  274.  
  275. The PC has seen the 'a' pressed, but never sees it released, so it will
  276. it considersit to be still pressed. The key is 'stuck', and will remain
  277. that way until a 'Break' for the 'a' is sent, either by hitting the 'a'
  278. on the keyboard, or sending a complete 'a' with the FLCS. It will remain
  279. stuck even if you exit the game.
  280.  
  281. The limitation on the /I, /O, /U, /M/ and /D codes can be overcome in a 
  282. couple of ways. One is simply to come up with a scheme that doesn't need
  283. them. The use of the /I and /O codes with held characters most commonly
  284. shows up in view switching situations. One method that works in some
  285. situations is to just use unmodified views on the hat, then add the 
  286. modifier key to button S3. For example, suppose that the four basic
  287. views are KP8, KP6, KP2, and KP4. Also assume that adding KP5 to these 
  288. four will add the UP modifier, and that adding KP0 to them will add the
  289. DOWN modifier, i.e. KP4 is Look Left and KP4 + KP5 is Look Up and Left. 
  290. In that case, a setup like this:
  291.  
  292.                          BTN H1U /H KP8
  293.                          BTN H1L /H KP4
  294.                          BTN H1D /H KP2
  295.                          BTN H1R /H KP6
  296.  
  297.                          BTN S3 /H KP5
  298.                          BTN S4 /H KP0
  299.  
  300. may prove workable, giving 12 views via combinations of the hat and the
  301. S3 and S4 keys.
  302.  
  303. If you can't find a suitable setup using the standard functions, you can 
  304. probably get around the problem using the RAW data codes.
  305.  
  306. RAW Data Codes
  307. --------------
  308.  
  309. RAW data codes allow you complete control over what the FLCS sends to 
  310. the PC. You specify the actual codes sent to the PC by their hex values. 
  311. There are no real limits placed on the use of RAW codes, they can be 
  312. used within the /I-/O and /U-/M-/D groups, and so you can generate any 
  313. key sequence that you want to. A complete listing of the RAW sequences 
  314. for the 'Make' and 'Break' codes on the 101-Key Keyboard is listed at 
  315. the end of this note.
  316.  
  317. The RAW data function was designed for situations where the normal FLCS 
  318. functions would not handle the task at hand. The most common use of 
  319. them is to generate the so-called 'non-native' keys that the FLCS will 
  320. not normally transmit. If you look over the RAW codes chart, you'll see 
  321. that the majority of keys send a single RAW code for a 'Make', and send 
  322. the value '#F0' followed by that same RAW code for the 'Break'. These 
  323. are the 'native' keys, and they correspond roughly to the keys on the 
  324. older 84-Key AT keyboards. The other 'non-native' keys are primarily 
  325. associated with the 101-Key Keyboard, and usually have an extra '#E0' 
  326. added to the sequence. These keys include the auxiliary 'T-Cursor' pad 
  327. and the other keys in the section of the 101-Key Keyboard between the 
  328. main keys and the numeric pad.
  329.  
  330. The other primary use of the RAW codes is to generate key combinations
  331. that cannot normally be generated by the FLCS, such as the use of held
  332. characters within /I-/O and /U-/M-/D Groups. The basic method for 
  333. simulating a /H group is to generate a /P-/R set with the 'Make' codes
  334. on the /P side and the 'Break' codes on the /R side. For instance:
  335.  
  336.                    BTN S1 /P RAW(#1C)
  337.                           /R RAW(#F0 #1C)
  338.  
  339. produces the same output as:
  340.  
  341.                        BTN S1 /H a
  342.  
  343. with the 'Make' code sent when the button is pressed and the 'Break' 
  344. code being sent when it's released.
  345.  
  346. As mentioned earlier, using RAW codes within the /I-/O and /U-/M-/D 
  347. groups is permitted, but it does not get around the basic problem with 
  348. the 'stuck' keys. You have to set the programming up so that the problem 
  349. does not occur. The usual method is to include the 'Make' codes for a 
  350. single function on the /P side, and to include the 'Break' codes for all 
  351. possible functions on the /R side. This is generally possible since 
  352. multiple 'Make' codes for a key generally do no harm, and 'Break' codes 
  353. for keys that have not been 'Made' are generally possible. For example. 
  354. the program segment:
  355.  
  356. would not compile, but the equivalent:
  357.  
  358.  BTN H1U /O /P RAW(#2B #34)                         rem Make 'f' and 'g'
  359.             /R RAW(#F0 #28 #F0 #34)                 rem Break f, g 
  360.          /I /P RAW(#73 #75)                         rem Make KP5 and KP8
  361.             /R RAW(#F0 #F0 #73 #F0 #75)             rem Break f, g, KP5 & KP8 
  362.  
  363. would compile just fine. This does not avoid the stuck key problem 
  364. though. You need to 'Break' both possibilities on both sides, even 
  365. though you will only 'Make' one of the codes:
  366.  
  367.  BTN H1U /O /P RAW(#2B #34)                         rem Make 'f' and 'g'
  368.             /R RAW(#F0 #28 #F0 #34 #F0 #73 #F0 #75) rem Break f, g, KP5 & KP8 
  369.          /I /P RAW(#73 #75)                         rem Make KP5 and KP8
  370.             /R RAW(#F0 #28 #F0 #34 #F0 #73 #F0 #75) rem Break f, g, KP5 & KP8 
  371.  
  372. One thing to watch for here is that all those RAW codes take some time 
  373. to send, about 50% longer than a regular /H group. The best thing to do 
  374. is to set the RATE parameter down to 0, increase it only if you experience 
  375. problems with the game in question. Most of the games will work just fine 
  376. with a RATE of 0, the exceptions are games that only handle 1 key stroke 
  377. per frame.
  378.  
  379. A couple of things worth mentioning. You can send sequences with RAW codes
  380. that will hang the keyboard. As long as you stick with the codes that are
  381. listed and get all the 'Makes' and 'Breaks' lined up, there's no problem,
  382. but you might need to reboot if you get them wrong. Also, you need to be
  383. aware of what combinations you generate with held keypresses, either with
  384.  
  385.  
  386.  
  387. -----------------------------------------------------------------------------
  388.  
  389.            *** STANDARD 101-KEY KEYBOARD SCAN CODE SEQUENCES ***
  390.              For Use with the FLCS 'RAW' Programming Function
  391.  
  392.                           ** Main Keyboard **
  393. ----------------------------------------------------------------------------
  394.   Key         Make Code                       Break Code         Notes
  395. ----------------------------------------------------------------------------
  396.   `              #0E                           #F0 #0E
  397.   1              #16                           #F0 #16
  398.   2              #1E                           #F0 #1E
  399.   3              #26                           #F0 #26
  400.   4              #25                           #F0 #25
  401.   5              #2E                           #F0 #2E
  402.   6              #36                           #F0 #36
  403.   7              #3D                           #F0 #3D
  404.   8              #3E                           #F0 #3E
  405.   9              #46                           #F0 #46
  406.   0              #45                           #F0 #45
  407.   -              #4E                           #F0 #4E
  408.   =              #55                           #F0 #55
  409.   Backspace      #66                           #F0 #66
  410.  
  411.   Tab            #0D                           #F0 #0D
  412.   Q              #15                           #F0 #15
  413.   W              #1D                           #F0 #1D
  414.   E              #24                           #F0 #24
  415.   R              #2D                           #F0 #2D
  416.   T              #2C                           #F0 #2C
  417.   Y              #35                           #F0 #35
  418.   U              #3C                           #F0 #3C
  419.   I              #43                           #F0 #43
  420.   O              #44                           #F0 #44
  421.   P              #4D                           #F0 #4D
  422.   [              #54                           #F0 #54
  423.   ]              #5B                           #F0 #5B
  424.   \              #5D                           #F0 #5D
  425.  
  426.   Caps Lock      #58                           #F0 #58
  427.   A              #1C                           #F0 #1C
  428.   S              #1B                           #F0 #1B
  429.   D              #23                           #F0 #23
  430.   F              #2B                           #F0 #2B
  431.   G              #34                           #F0 #34
  432.   H              #33                           #F0 #33
  433.   J              #3B                           #F0 #3B
  434.   K              #42                           #F0 #42
  435.   L              #4B                           #F0 #4B
  436.   ;              #4C                           #F0 #4C
  437.   '              #52                           #F0 #52
  438.   Enter          #5A                           #F0 #5A
  439.  
  440.   Left Shift     #12                           #F0 #12
  441.   Z              #1A                           #F0 #1A
  442.   X              #22                           #F0 #22
  443.   C              #21                           #F0 #21
  444.   V              #2A                           #F0 #2A
  445.   B              #32                           #F0 #32
  446.   N              #31                           #F0 #31
  447.   M              #3A                           #F0 #3A
  448.   ,              #41                           #F0 #41
  449.   .              #49                           #F0 #49
  450.   /              #4A                           #F0 #4A
  451.   Right Shift    #59                           #F0 #59
  452.  
  453.   Left Ctrl      #14                           #F0 #14
  454.   Left Alt       #11                           #F0 #11
  455.   Space          #29                           #F0 #29
  456.   Right Alt      #E0 #11                       #E0 #F0 #11
  457.   Right Ctrl     #E0 #14                       #E0 #F0 #14
  458.   ESC            #76                           #F0 #76
  459. ----------------------------------------------------------------------------
  460.  
  461.  
  462.                           ** Function Keys **
  463. ----------------------------------------------------------------------------
  464.   Key         Make Code                       Break Code        Notes
  465. ----------------------------------------------------------------------------
  466.   F1             #05                           #F0 #05
  467.   F2             #06                           #F0 #06
  468.   F3             #04                           #F0 #04
  469.   F4             #0C                           #F0 #0C
  470.   F5             #03                           #F0 #03
  471.   F6             #0B                           #F0 #0B
  472.   F7             #83                           #F0 #83
  473.   F8             #0A                           #F0 #0A
  474.   F9             #01                           #F0 #01
  475.   F10            #09                           #F0 #09
  476.   F11            #78                           #F0 #78
  477.   F12            #07                           #F0 #07
  478. ----------------------------------------------------------------------------
  479.  
  480.  
  481.                             ** Numeric Pad **
  482. ----------------------------------------------------------------------------
  483.   Key         Make Code                       Break Code         Notes
  484. ----------------------------------------------------------------------------
  485.   NumLok         #77                           #F0 #77
  486.   KP-            #7B                           #F0 #7B
  487.   KP/            #E0 #4A                       #E0 #F0 #4A     Notes 1, 2
  488.   KP.            #71                           #F0 #71
  489.   KP*            #7C                           #F0 #7C
  490.   KP+            #79                           #F0 #79
  491.   KPEnter        #E0 #5A                       #E0 #F0 #5A
  492.  
  493.   KP0            #70                           #F0 #70
  494.   KP1            #69                           #F0 #69
  495.   KP2            #72                           #F0 #72
  496.   KP3            #7A                           #F0 #7A
  497.   KP4            #6B                           #F0 #6B
  498.   KP5            #73                           #F0 #73
  499.   KP6            #74                           #F0 #74
  500.   KP7            #6C                           #F0 #6C
  501.   KP8            #75                           #F0 #75
  502.   KP9            #7D                           #F0 #7D
  503. ----------------------------------------------------------------------------
  504.  
  505.  
  506.                            ** Auxiliary Pads **
  507. ----------------------------------------------------------------------------
  508.   Key           Make Code                      Break Code        Notes
  509. ----------------------------------------------------------------------------
  510.   Ins            #E0 #70                       #E0 #F0 #70    Notes 1, 2, 3
  511.   Home           #E0 #6C                       #E0 #F0 #6C    Notes 1, 2, 3
  512.   Pg Up          #E0 #7D                       #E0 #F0 #7D    Notes 1, 2, 3
  513.   Del            #E0 #71                       #E0 #F0 #71    Notes 1, 2, 3
  514.   End            #E0 #69                       #E0 #F0 #69    Notes 1, 2, 3
  515.   Pg Dn          #E0 #7A                       #E0 #F0 #7A    Notes 1, 2, 3
  516.  
  517.   Up Arrow       #E0 #75                       #E0 #F0 #75    Notes 1, 2, 3
  518.   Left Arrow     #E0 #6B                       #E0 #F0 #6B    Notes 1, 2, 3
  519.   Right Arrow    #E0 #74                       #E0 #F0 #74    Notes 1, 2, 3
  520.   Down Arrow     #E0 #72                       #E0 #F0 #72    Notes 1, 2, 3
  521.  
  522.   PrtSc          #E0 #12 #E0 #7C               #E0 #F0 #7C #E0 #F0 #12
  523.   Ctl-PrtSc      #E0 #7C                       #E0 #F0 #7C
  524.   Alt-PrtSc      #84                           #E0 #84
  525.   ScrLk          #7E                           #F0 #7E
  526.   Pause          #E1 #14 #77 #E1 #F0 #14 #77   None
  527.   Ctrl-Break     #E0 #7E #E0 #F0 #7E           None
  528.  
  529. ----------------------------------------------------------------------------
  530.  
  531.  
  532.                                 ** Notes **
  533. ----------------------------------------------------------------------------
  534.  
  535.   The actual keyboard makes certain modifications to some of the key code
  536.   sequences depending on the Shift and NumLock states. These can normally
  537.   be ignored in using the RAW codes with the FLCS, but are included here
  538.   for completeness. They only apply where there is an entry in the 'Notes'
  539.   column for the key of interest.
  540.  
  541.   The '#** #**' entry represesnts the Make Code and the '#** #** #**' entry
  542.   represents the  Break Code specified for the character in the main chart
  543.   and should be replaced with those sequences in actual use.
  544.  
  545.  
  546.   Note 1
  547.  
  548.      If Left Shift is Down:
  549.  
  550.         Make Sequence - #E0 #F0 #12 #** #**
  551.        Break Sequence _ #** #** #** #E0 #12
  552.  
  553.   Note 2
  554.  
  555.     If Right Shift is Down:
  556.  
  557.         Make Sequence - #E0 #F0 #59 #** #**
  558.        Break Sequence - #** #** #** #E0 #59
  559.  
  560.   Note 3
  561.  
  562.     If Num Lock is On:
  563.  
  564.         Make Sequence - #E0 #12 #** #**
  565.        Break Sequence - #** #** #** #E0 #F0 #12
  566.  
  567. -----------------------------------------------------------------------------
  568.                             -- End of Document --
  569.